package br.com.redefranciscanas.wiki.view;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.log4j.Logger;
import org.primefaces.model.UploadedFile;

import br.com.redefranciscanas.wiki.domain.Item;
import br.com.redefranciscanas.wiki.domain.Topico;
import br.com.redefranciscanas.wiki.enumerado.NvlAcesso;
import br.com.redefranciscanas.wiki.persistence.ItemDao;
import br.com.redefranciscanas.wiki.persistence.TopicoDao;

public class FileUploadMB {
	private String titulo;
	private String categoria;
	private String resumo;
	private String caminho;
	private Long nvlAcesso;
	private UploadedFile file;
	TopicoDao tdao;
	ItemDao idao;
	private static Logger log = Logger.getLogger(FileUploadMB.class);

	public UploadedFile getFile() {
		return file;
	}

	public void setFile(UploadedFile file) {
		this.file = file;
	}

	public String getTitulo() {
		return titulo;
	}

	public void setTitulo(String titulo) {
		this.titulo = titulo;
	}

	public String getCategoria() {
		return categoria;
	}

	public void setCategoria(String categoria) {
		this.categoria = categoria;
	}

	public String getResumo() {
		return resumo;
	}

	public void setResumo(String resumo) {
		this.resumo = resumo;
	}

	public String getCaminho() {
		return caminho;
	}

	public void setCaminho(String caminho) {
		this.caminho = caminho;
	}

	public Long getNvlAcesso() {
		return nvlAcesso;
	}

	public void setNvlAcesso(Long nvlAcesso) {
		this.nvlAcesso = nvlAcesso;
	}

	public void upload() {

		tdao = new TopicoDao();
		if (file != null) {
			String nomeDoArquivo = file.getFileName();
			byte[] arquivo = file.getContents();
			log.info(file.getFileName() + " is uploaded. " + "Tamanho: " + arquivo.length);
			caminho = verificaDiretorio(categoria, titulo);
			if (caminho != null) {
				try {
					FileOutputStream fos = new FileOutputStream(caminho + "/" + nomeDoArquivo);
					fos.write(arquivo);
					fos.close();
				} catch (IOException e) {
					log.fatal("Erro ao salvar arquivo: " + e);
				}

				salvaTopico(titulo, caminho, resumo);
				Topico t = tdao.buscaTopicoPeloTitulo(titulo);
				Long idTopico = t.getId();
				String tamanho = String.valueOf(arquivo.length);
				salvaItem(idTopico, nomeDoArquivo, tamanho, nvlAcesso);
				limpa();
			}
		} else {
			System.out.println("file está null. " + file.getFileName());
		}
	}

	public void limpa() {
		titulo = null;
		categoria = null;
		nvlAcesso = null;
		resumo = null;

	}

	private void salvaTopico(String titulo, String caminho, String resumo) {
		Topico topico = new Topico();
		topico.setTitulo(titulo);
		topico.setCaminho(caminho);
		topico.setResumo(resumo);
		tdao = new TopicoDao();
		tdao.insere(topico);
		if (new File(caminho).exists())
			log.info("Topico inserido com sucesso.");
	}

	public void salvaItem(Long idTopico, String nomeDoArquivo, String tamanho, Long nvlAcesso) {
		Item item = new Item();
		idao = new ItemDao();
		item.setIdTopico(idTopico);
		item.setNomeArquivo(nomeDoArquivo);
		item.setTamanho(tamanho);
		item.setNvlAcesso(NvlAcesso.getAcesso(nvlAcesso));
		idao.insere(item);
		if (idao.verificaSeHaItemComNomeDoArquivo(nomeDoArquivo))
			log.info("Item inserido com sucesso.");

	}

	public String verificaDiretorio(String categoria, String titulo) {
		String nomeDiretorio = null;
		String separador = java.io.File.separator;
		String pastaDestino = "testeJava";// pasta onde estará todos os topicos

		try {
			nomeDiretorio = "C:" + separador + pastaDestino + separador + categoria + separador + titulo;

			if (!new File(nomeDiretorio).exists()) { // Verifica se o diretório existe.
				(new File(nomeDiretorio)).mkdirs(); // Cria o diretório
				return nomeDiretorio;
			} else {
				return nomeDiretorio;
			}
		} catch (Exception ex) {
			log.fatal("erro ao criar a pasta");
			return null;
		}

	}

}